<?php
namespace app\admin\model\logic;

use think\Model;

class AdminAuth extends Model
{
    //逻辑层user模型初始化存储层方法
    public function __construct()
    {
        $this->auth = app('app\admin\model\db\AdminAuth');
    }
    //根据管理员角色ID 获取权限列表
    public function get_auth_list($id)
    {
        $where['role_id']=$id;
        $rs_list=$this->auth->where($where)->column('action_id');
        if(empty($rs_list)){
            $rs_arr['code']=0;
        }else{
            $rs_arr['code']=1;
            $rs_arr['data']=$rs_list;
        }
        return $rs_arr;
    }
    //权限判断
    public function auth_check($role_id,$action_id)
    {
        $where['role_id']=$role_id;
        $where['action_id']=$action_id;
        $rs_st=$this->auth->where($where)->find();
        if(empty($rs_st)){
            $rs_arr['code']=0;
        }else{
            $rs_arr['code']=1;
        }
        return $rs_arr;
    }
    //删除角色时删除该角色的权限
    public function role_del($role_id)
    {
        $rs_st=$this->auth->where(['role_id'=>$role_id])->delete();
        if($rs_st!=false){
            $rs_arr['code']=1;
        }else{
            $rs_arr['code']=0;
        }
        return $rs_arr;
    }
    //删除菜单时自动删除该菜单所有的权限记录
    public function action_del($action_id)
    {
        $rs_st=$this->auth->where(['action_id'=>$action_id])->delete();
        if($rs_st!=false){
            $rs_arr['code']=1;
        }else{
            $rs_arr['code']=0;
        }
        return $rs_arr;
    }
    //添加菜单时自动给超级管理员增加一个权限
    public function base_role_add($action_id)
    {
        $in_data['role_id']=1;
        $in_data['action_id']=$action_id;
        $rs_st=$this->auth->allowField(true)->isUpdate(false)->save($in_data);
        if($rs_st!=false){
            $rs_arr['code']=1;
        }else{
            $rs_arr['code']=0;
        }
        return $rs_arr;
    }
    //给角色授权
    public function save_authority()
    {
        $post_data=input();
        $validate=validate('role');
        if($validate->scene('action')->check($post_data)){
            $where['role_id']=$post_data['id'];
            $auth_list=$this->auth->where($where)->column('action_id');//已经获得权限的列表
            $post_auth_list=json_decode($post_data['id_list']);//需要授权的权限列表
            $all_auth_list= model('logic.admin_action')->get_action_field();//获取所有的权限节点
            $not_auth_list=array_diff($all_auth_list,$post_auth_list);//用总权限列表和传上来的权限列表比较差集 找到所有未获得权限的节点
            if(!empty($auth_list)   ){
                $del_list=array_intersect($not_auth_list,$auth_list);//用没有获取权限的列表比较已经获得权限的列表判断哪些权限需要删除获得需要删除的节点列表
            }else{
                $del_list=[];
            }
            if(count($del_list)>0){//把需要删除的节点干掉
                $del_list=array_values($del_list);
                $del_where['role_id']=$post_data['id'];
                $del_where['action_id']=['in',$del_list];
                $this->auth->where($del_where)->delete();
            }
            $where['role_id']=$post_data['id'];
            $new_auth_list=$this->auth->where($where)->column('action_id');//获取进行删除权限后最新的权限表
            if(!empty($new_auth_list)){
                $add_auth_list=array_diff($post_auth_list,$new_auth_list);//比较传上来的列表中比现有权限多的一部分 视为可新增除的节点列表
            }else{
                $add_auth_list=$post_auth_list;
            }
            $add_auth_list=array_values($add_auth_list);
            if(count($add_auth_list)>0){//把需要删除的节点干掉
                foreach($add_auth_list as $ve){//把需要增加的节点给加上
                    $in_data[]=['role_id'=>$post_data['id'],'action_id'=>$ve];
                }
                $this->auth->allowField(true)->isUpdate(false)->saveAll($in_data);
            }
            $rs_arr['code']=1;
            $rs_arr['msg']='授权成功';
        }else{
            $rs_arr['code']=0;
            $rs_arr['msg']=$validate->getError();
        }
        return  $rs_arr;
    }
}